package date_demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @author ChenYongHao
 * @date 2023/5/4 10:21
 * @desc 格式化时间
 * 描述：通过localDate.format方法格式化，格式可以是内置的也可以是自定义的
 */

public class Format_Date_Demo {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2020, 05, 05);

        // 内置格式
        String s1 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(s1);

        // 自定义格式
        String s2 = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(s2);
        System.err.println("dateConverUTC(s2) = " + dateConverUTC(s2));

        // 内置格式
        LocalDate localDate1 = LocalDate.parse("2019-09-12", DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(localDate1);

        // 自定义格式
        LocalDate localDate2 = LocalDate.parse("2019-09-12", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(localDate2);
    }


    /**
     * 本地时间字符串转换UTC时间格式字符串
     * @param localDateStr 本地时间字符串
     * @return UTC时间格式字符串
     */
    public static String dateConverUTC (String localDateStr) {
        System.out.println("===========>本地时间格式转UTC时间格式，传入参数：{}" + localDateStr);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
        SimpleDateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        Calendar cal = Calendar.getInstance();
        // 取得时间偏移量：
        int zoneOffset = cal.get(Calendar.ZONE_OFFSET);
        // 取得夏令时差：
        int dstOffset = cal.get(Calendar.DST_OFFSET);
        try {
            Date dateValue = format.parse(localDateStr);
            long longDate = dateValue.getTime();
            longDate = longDate - zoneOffset - dstOffset;
            Date UTCDate = new Date(longDate);
            System.out.println("===========>UTC时间格式转本地时间格式，转换成功：{}" + utcFormat.format(UTCDate));
            return utcFormat.format(UTCDate);
        } catch (ParseException e) {
             System.out.println("===========>UTC时间格式转本地时间格式，异常{}"+e.getMessage());

            return null;
        }
    }

    /**
     * UTC时间格式字符串转本地时间字符串
     * @param UTCDateStr UTC格式时间字符串
     * @return 本地时间字符串
     */
    public static String UTCConverDate (String UTCDateStr) {
        System.out.println("===========>UTC时间格式转本地时间格式，传入参数：{}" + UTCDateStr);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
        SimpleDateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        Calendar cal = Calendar.getInstance();
        // 取得时间偏移量：
        int zoneOffset = cal.get(Calendar.ZONE_OFFSET);
        // 取得夏令时差：
        int dstOffset = cal.get(Calendar.DST_OFFSET);
        try {
            Date UTCDateValue = utcFormat.parse(UTCDateStr);
            long UTCLongDate = UTCDateValue.getTime();
            UTCLongDate = UTCLongDate + zoneOffset + dstOffset;
            Date UTCDate = new Date(UTCLongDate);
            System.out.println("===========>UTC时间格式转本地时间格式，转换成功：{}" + format.format(UTCDate));
            return format.format(UTCDate);
        } catch (ParseException e) {
             System.out.println("===========>UTC时间格式转本地时间格式，异常{}"+e.getMessage());
            return null;
        }
    }
}
